/** 
 * new Date() ---> 转化为 年 月 日 时 分 秒
 * let date = new Date();
 * date: 传入参数日期 Date
*/
function formatTime(date, format = "/", showZero = false) {
    var year = date.getFullYear()
    var month = date.getMonth() + 1
    var day = date.getDate()

    var hour = date.getHours()
    var minute = date.getMinutes()
    var second = date.getSeconds()


    return [year, month, day].map(showZero ? formatNumber : (n) => n).join(format) + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

function formatNumber(n) {
    n = n.toString()
    return n[1] ? n : '0' + n
}

/*
* 时间戳转化为年 月 日 时 分 秒 
* number: 传入时间戳 
* format：返回格式，支持自定义，但参数必须与formateArr里保持一致 
*/
function formatTimeTwo(number, format) {

    var formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
    var returnArr = [];

    var date = new Date(number);
    returnArr.push(date.getFullYear());
    returnArr.push(formatNumber(date.getMonth() + 1));
    returnArr.push(formatNumber(date.getDate()));

    returnArr.push(formatNumber(date.getHours()));
    returnArr.push(formatNumber(date.getMinutes()));
    returnArr.push(formatNumber(date.getSeconds()));

    for (var i in returnArr) {
        format = format.replace(formateArr[i], returnArr[i]);
    }
    return format;
}


/** 
 * 返回星期几
 * @param {*} date  日期字符串，格式为 yyyy-MM-dd
 * @param { boolean } state 选择是周几还是星期几
 */
function getWeek(date, state) {
    if (date) {
        if (typeof date === "string" && date.indexOf("-") > -1) {
            date = date.replace(/-/g, "/")
        }
    }
    let weekIndex = new Date(date).getDay()
    let showLabe = state ? "周" : "星期"
    let w = ["日", "一", "二", "三", "四", "五", "六"]
    return showLabe + w[weekIndex]
}


/**
 * @description 防抖函数
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行，false 表非立即执行
 */
function debounce(func, wait = 1500, immediate = true) {
    let timeout
    return function () {
        if (timeout) clearTimeout(timeout)
        if (immediate) {
            // 立即执行
            var callNow = !timeout
            timeout = setTimeout(() => {
                timeout = null
            }, wait)
            if (callNow) func.apply(this, arguments)
        } else {
            // 非立即执行
            timeout = setTimeout(() => {
                func.apply(this, arguments)
            }, wait)
        }
    }
}

/**
 * @description 节流函数 (定时器版)
 * @param func 函数
 * @param wait 延迟执行毫秒数
 */
function throttle(func, wait = 500) {
    let lastTime = 0
    return function () {
        const nowTime = Date.now()
        if (nowTime - lastTime > wait) {
            func.apply(this, arguments)
            lastTime = nowTime
        }
    }
}

// 判断当前日期是否在开始日期和结束日期之间
function isDuringDate(beginDateStr, endDateStr, nowDateStr) {
    var curDate = nowDateStr ? new Date(nowDateStr) : new Date(),
        beginDate = new Date(beginDateStr),
        endDate = new Date(endDateStr);
    if (curDate >= beginDate && curDate <= endDate) {
        return true;
    }
    return false;
}

// 距离开始时间的剩余时间
function distanceTime(beginDateStr) {
    let startTime = beginDateStr ? new Date(beginDateStr) : new Date(); // 开始时间
    let endTime = new Date(); // 结束时间
    let usedTime = endTime - startTime; // 相差的毫秒数
    let days = Math.floor(usedTime / (24 * 3600 * 1000)); // 计算出天数
    let leave = usedTime % (24 * 3600 * 1000); // 计算天数后剩余的时间
    let hours = Math.floor(leave / (3600 * 1000)); // 计算剩余的小时数
    let leave2 = leave % (3600 * 1000); // 计算剩余小时后剩余的毫秒数
    let minutes = Math.floor(leave2 / (60 * 1000)); // 计算剩余的分钟数
    return days + '天' + hours + '时' + minutes + '分';
}


export default {
    getWeek,
    formatNumber,
    formatTime,
    formatTimeTwo,
    debounce,
    throttle,
    isDuringDate,
}